Volatile 的使用场景及使用模式说明

Volatile在一般的多线程编程里面算是比较尴尬的关键字,在java里面叫做程度较轻的 synchronized,不过一般在一些多线程的文章里面几乎不提到Volatile或者不建议使用这个关键字,毕竟这个关键字非常不好控制,干脆不用为好,我的看法是大多是时候么搞不清楚就不要用,(当然越不用就越生疏,呵呵),但是话说回来我对这个关键字实现高性能读写锁还是比较感兴趣的

首先总结一下Volatile的特性:

可见性,但不互斥.怎么理解这句话,首先可见性的原因是以为,这个关键字可以让变量不缓存在寄存器里面,每次取值都是直接从主存里面获取,所以每次都是最新的值.但是不互斥是因为没有锁,这里有个改变值的流程(读取-修改-写入),这是一个比读更耗时的一个操作,在没有加锁的情况下别的线程读取这个值可能是任何一个时刻的值;所以根据这个特性可以推导出使用Volatile在少写多读的情况下,性能非常好,当然首先要保证不会是多线程同时写.

Volatile有五个使用场景(参考Brian Goetz ([email protected])的文章):

  1. 作为状态标志
  2. 一次性安全发布
  3. 独立观察
  4. volatile bean模式
  5. 开销较低的读写锁策略

具体内容可以拜读一下]原文

其中第五个还是值得推广应用一下的,其他的几种模式使用起来我个人觉得还是需要保持谨慎的,毕竟自己的代码还能保证变量不互斥,一旦是团队合作的话就很难保证了,因为你不可能跟团队的内一个人说这个是volatile的.

虽然基础,但是免得自己忘记了,记录一下.

坚持原创技术分享,您的支持将鼓励我继续创作!